package util.concurrent;

/**
 * http://mp.weixin.qq.com/s/ILtU2NO-OM9naECFv1Orxw     详细讲解
 * <p>
 * wait():  对象调用  wait 方法 就会使持有该对象的线程把该对象的控制权交出去，然后处于等待状态。
 * //必须 其他拿到锁的对象显示的调用一句话 notify 才可以 得到锁
 * <p>
 * notify():  对象调用  notify 方法就会通知某个正在等待这个对象的控制权的线程可以继续运行,选择是任意的。
 * notifyAll(): 如果对象调用 notifyAll 方法就会通知所有等待这个对象控制权的线程继续运行。
 * <p>
 * 注意：wait被执行后，会自动释放锁，而notify被执行后，锁没有立刻释放，由synchronized同步块结束时释放。
 */
public class Base {
    private synchronized void run() {
        try {
            wait();   //fixme  获取到锁，释放 等待别的获取到锁的线程 通知
            System.out.println("执行完毕");
        } catch (InterruptedException e) {
        }
    }

    public static void main(String[] args) {
        Base base = new Base();

        new Thread(() -> base.run()).start();

        new Thread(() -> {
            synchronized (base) { //获取到锁
                base.notify();    //通知
                System.out.println("结束");
            }
        }).start();
    }

}
